'''
import tensorflow as tf
import numpy as np

 
#tf.Variable ：变量 Tensor，需要指定初始值，常用于定义可变参数，例如神经网络的权重。
#tf.constant ：常量 Tensor，需要指定初始值，定义不变化的张量。

    # tf.zeros：新建指定形状且全为 0 的常量 Tensor
    # tf.zeros_like：参考某种形状，新建全为 0 的常量 Tensor
    # tf.ones：新建指定形状且全为 1 的常量 Tensor
    # tf.ones_like：参考某种形状，新建全为 1 的常量 Tensor
    # tf.fill：新建一个指定形状且全为某个标量值的常量 Tensor

c = np.arange(10).reshape(5,2)
print("c:")
print(c)

cc = tf.ones_like(c)  # 与 c 形状一致全为 1 的常量 Tensor
print("cc:")
print(cc)
'''
    # tf.linspace：创建一个等间隔序列。
    # tf.range：创建一个数字序列。
'''

d = tf.linspace(1.0, 10.0, 5, name="linspace")
print(d)

tf.range(start=1, limit=10, delta=2)

a = tf.constant([1., 2., 3., 4., 5., 6.], shape=[2, 3])
b = tf.constant([7., 8., 9., 10., 11., 12.], shape=[3, 2])

c = tf.linalg.matmul(a, b)  # 矩阵乘法
tf.linalg.matrix_transpose(c)  # 转置矩阵

#自动微分
w = tf.Variable([1.0])  # 新建张量

'''
# with as 
#  类似try catch finally
#  防止异常
#  语法：
#      with A as B: 
#          ******

'''

with tf.GradientTape() as tape:  # 追踪梯度
    loss = w * w

grad = tape.gradient(loss, w)  # 计算梯度

m = tf.Variable(4)
m.assign_sub(1)#自减1
print("m=%d"%m)

'''